import axios, { AxiosRequestConfig, AxiosRequestHeaders } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { store } from '@/store'
import router from '@/router/'

const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASEURL // 'https://shop.fed.lagou.com/api/admin'
  // baseURL: '/admin' // 如果需要配置代理的请求,但是如果多个代理，就不行了，在api里加前缀也行
})

request.interceptors.request.use(config => {
  // 统一设置用户身份 token
  const user = store.state.user
  if (user && user.token) {
    (config.headers as AxiosRequestHeaders).Authorization = `Bearer ${user.token}`
  }
  return config
}, error => {
  return Promise.reject(error)
})

// 控制登陆过期得锁
let isRefreshing = false

request.interceptors.response.use(response => {
  // 统一处理接口响应错误 token过期，服务器异常等
  const status = response.data.status

  // 正常情况
  if (!status || status === 200) {
    return response
  }

  // 错误情况，比如token失效..
  if (status === 410000) {
    if (isRefreshing) return Promise.reject(response)
    isRefreshing = true
    ElMessageBox.confirm('您登录已过期，您可以取消停留在此页面或确认重新登陆', '登陆过期', {
      confirmButtonText: '确认',
      cancelButtonText: '取消'
    }).then(() => {
      store.commit('setUser', null)
      router.push({
        name: 'login',
        query: {
          redirect: router.currentRoute.value.fullPath
        }
      })
    }).finally(() => {
      isRefreshing = false
    })
    // 内部消化掉业务异常
    return Promise.reject(response)
  }

  // 其他错误情况
  ElMessage.error(response.data.msg || '请求失败，请稍后重试')
  return Promise.reject(response)

  // if (response.data.status && response.data.status !== 200) {
  //   ElMessage.error(response.data.msg || '请求失败，请稍后重试')
  //   // 返回值不使用response，如果错误，返回promise异常
  //   // 此时页面内的请求await 就不会往下走了,也就不会replace跳转了
  //   return Promise.reject(response.data)
  // }
  // return response
}, error => {
  return Promise.reject(error)
})

export default <T>(config:AxiosRequestConfig) => {
  return request(config).then(res => (res.data.data || res.data) as T)
}
